home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy005 / memory / xmsmem.inc < prev   
Encoding:
Text File  |  1997-08-30  |  5.4 KB  |  141 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;;  Rutinas para controlar la memoria XMS en assembler  ;;;;
  3. ;;;;;;;;;;;  By Navi/PhyMosys - Vilamarxant 1997   ;;;;;;;;;;;
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. ;
  6. ;  ATENCIαN: Este fichero debe ser incluido dentro de la parte
  7. ;            de  código  del programa para  poderse  ensamblar
  8. ;            correctamente.
  9. ;
  10.  
  11. ;;;;  ╡REA DE DATOS.
  12. DriverXMS       DD      0       ;  Dirección del driver de XMS.
  13.  Longitud       DD      0       ;  Las 5 variables que vienen a continuación
  14.  SHandle        DW      0       ; son la estructura que recibe la función de
  15.  SOffset        DD      0       ; movimiento de datos para copiar desde/hasta
  16.  DHandle        DW      0       ; XMS.
  17.  DOffset        DD      0
  18.  
  19. MsgError        DB      'Se ha producido un error inesperado$'
  20.  
  21. ;;;;  ╡REA DE CODIGO.
  22.  
  23. ;;; InicXMS: Inicializa la memoria XMS.
  24. ;;; Entrada: --
  25. ;;; Salida: Carry si error.
  26. ;;; Modifica: --
  27. ;;; Observaciones: "DriverXMS" se actualiza con un puntero al driver de XMS.
  28. InicXMS         PROC
  29.                 PUSHA
  30.                 MOV     AX, 4300h
  31.                 INT     2Fh             ;  Chequeamos a ver si hay XMS.
  32.                 CMP     AL, 80h
  33.                 JNE    ErrorXMS         ;  Si está instalado el driver...
  34.                 PUSH    ES
  35.                 MOV     AX, 4310h       ;  Otra llamada al MUX para consegir
  36.                 INT     2Fh             ; la dirección del driver.
  37.                 MOV     WORD PTR CS:[DriverXMS+0], BX
  38.                 MOV     WORD PTR CS:[DriverXMS+2], ES
  39.                 POP     ES              ;  Guardamos las direcciones y
  40.                 CLC                     ; regresamos sin error.
  41.                 POPA
  42.                 RET
  43. InicXMS         ENDP
  44.  
  45. ;;; ReservaXMS: Reserva memoria XMS.
  46. ;;; Entrada: DX=Kb a reservar
  47. ;;; Salida: DX=Handle de XMS. Carry si error.
  48. ;;; Modifica: AX, BX y DX.
  49. ;;; Observaciones: --
  50. ReservaXMS      PROC                    ;  Llamamos a la función 09h del
  51.                 MOV     AH, 09h         ; driver de XMS.
  52.                 CALL    DWORD PTR CS:[DriverXMS]
  53.                 OR      AX, AX
  54.                 JZ    ErrorXMS          ;  Si AX=0 entonces hay un error...
  55.                 RET
  56. ReservaXMS      ENDP
  57.  
  58. ;;; DevuelveXMS: Libera memoria XMS.
  59. ;;; Entrada: DX=Handle de XMS.
  60. ;;; Salida: Carry si error.
  61. ;;; Modifica: AX.
  62. ;;; Observaciones: --
  63. DevuelveXMS     PROC
  64.                 MOV     AH, 0Ah         ;  La función 0Ah es la de liberación.
  65.                 CALL    DWORD PTR CS:[DriverXMS]
  66.                 OR      AX, AX
  67.                 JZ    ErrorXMS          ;  Si hay algún error...
  68.                 RET
  69. DevuelveXMS     ENDP
  70.  
  71. ;;; CopiaXMS: Cópia de memoria baja a la XMS algo.
  72. ;;; Entrada: DX=Handle de XMS.
  73.   ;          ECX=Longitud.
  74.   ;          EBX=Desplazamiento (dentro de la MEM XMS).
  75.   ;          DS:SI=Dirección origen.
  76. ;;; Salida: Carry si error.
  77. ;;; Modifica: --
  78. ;;; Observaciones: --
  79. CopiaXMS        PROC
  80.                 PUSHAD
  81.                 XOR     EAX, EAX        ;  Lo primero es inicializar variables.
  82.                 MOV     CS:[Longitud], ECX
  83.                 MOV     CS:[DHandle], DX
  84.                 MOV     CS:[DOffset], EBX
  85.                 MOV     CS:[SHandle], AX
  86.                 MOV     WORD PTR CS:[SOffset+0], SI
  87.                 MOV     WORD PTR CS:[SOffset+2], DS
  88.                 PUSH    DS
  89.                 MOV     AX, CS          ;  Metemos en DS:SI la dirección de
  90.                 MOV     DS, AX          ; la estructura.
  91.                 MOV     SI, Offset Longitud
  92.                 MOV     AH, 0Bh         ;  La función 0Bh es la que cópia.
  93.                 CALL    DWORD PTR CS:[DriverXMS]
  94.                 OR      AX, AX
  95.                 JZ    ErrorXMS          ;  Si se produce algún error...
  96.                 POP     DS
  97.                 POPAD
  98.                 RET
  99. CopiaXMS        ENDP
  100.  
  101. ;;; CopiaMEM: Cópia de XMS a memoria baja.
  102. ;;; Entrada: DX=Handle de XMS.
  103.   ;          ECX=Longitud.
  104.   ;          EBX=Desplazamiento (dentro de la MEM XMS).
  105.   ;          DS:SI=Dirección destino.
  106. ;;; Salida: Carry si error.
  107. ;;; Modifica: --
  108. ;;; Observaciones: --
  109. CopiaMEM        PROC
  110.                 PUSHAD
  111.                 XOR     EAX, EAX        ;  Lo primero es inicializar variables.
  112.                 MOV     CS:[Longitud], ECX
  113.                 MOV     CS:[DHandle], AX
  114.                 MOV     CS:[SOffset], EBX
  115.                 MOV     CS:[SHandle], DX
  116.                 MOV     WORD PTR CS:[DOffset+0], SI
  117.                 MOV     WORD PTR CS:[DOffset+2], DS
  118.                 PUSH    DS
  119.                 MOV     AX, CS          ;  Metemos en DS:SI la dirección de
  120.                 MOV     DS, AX          ; la estructura.
  121.                 MOV     SI, Offset Longitud
  122.                 MOV     AH, 0Bh         ;  La función 0Bh es la que cópia.
  123.                 CALL    DWORD PTR CS:[DriverXMS]
  124.                 OR      AX, AX
  125.                 JZ    ErrorXMS          ;  Si se produce algún error...
  126.                 POP     DS
  127.                 POPAD
  128.                 RET
  129. CopiaMEM        ENDP
  130.  
  131. ;;;  Aquí se llama si hay algun error.
  132. ErrorXMS        PROC
  133.                 PUSH    CS
  134.                 POP     DS
  135.                 MOV     DX, Offset MsgError
  136.                 MOV     AH, 9
  137.                 INT     21h             ;  Escribir un mensaje.
  138.                 MOV     AX, 4C03h
  139.                 INT     21h             ;  Salir al DOS.
  140. ErrorXMS        ENDP
  141.